package main

import (
	"fmt"
)

// "fmt"

// func f1(){
// 	fmt.Println("开始")
// 	defer func(){
// 		fmt.Println("aaaa")
// 	}()
// 	fmt.Println("结束")
// }
// func f2() int{
// 	var a int //a=0
// 	defer func(){
// 		a++
// 	}()
// 	// fmt.Println("结束")
// 	return a //返回0
// }
// // 命名返回值
// func f3() (a int){
// 	defer func(){ //返回1
// 		a++
// 	}()
// 	// fmt.Println("结束")
// 	return a
// }
// func f1() int{
// 	var x int
// 	// 匿名函数
// 	defer func(){
// 		x++
// 	}()
// 	return x  //返回0

// }
// func f2() (x int){
// 	defer func ()  {
// 		x++
// 	}()
// 	return 5  //6
// }
// func f3() (y int){
// 	x :=5
// 	defer func(){
// 		x++
// 	}()
// 	return x  //5
// }
// func f4() (x int){
// 	defer func(x int){
// 		// x =0
// 		fmt.Println(x)
// 		x++
// 	}(x)  //defer注册要延迟执行的函数时该函数所有的参数都需要确定其值
// 		fmt.Println("a=",x)
// 	return 5
// }
// 定义一个calc方法
func calc(index string,a,b int) int{
	ret :=a + b 
	fmt.Println(index,a,b,ret)
	return ret
}
func main() {
	// defer在命名返回值和匿名返回 函数中表现不一样
	// fmt.Println("开始")
	// defer fmt.Println(1)
	// defer fmt.Println(2)
	// defer fmt.Println(3)
	// defer fmt.Println("结束")

	// f1()
	// fmt.Println(f2()) 
	// 	fmt.Println(f3()) 

	// fmt.Println(f1())
	// fmt.Println(f2())
	// fmt.Println(f3())
	// fmt.Println(f4())

	x := 1
	y :=2
	defer calc("AA",x,calc("A",x,y)) //a 1 2 3
	x=10
	defer calc("BB",x,calc("B",x,y))
	y =20
	// 注册顺序 
	// defer calc("AA",x,calc("A",x,y))
	// defer calc("BB",x,calc("B",x,y))
// 	// 执行顺序
// 	defer calc("BB",x,calc("B",x,y))
// defer calc("AA",x,calc("A",x,y))

// calc("A",x,y)  a 1 2 3
// calc("B",x,y) b 10 2 12
// calc("BB",x,calc("B",x,y)) bb  1 3
//  calc("AA",x,calc("A",x,y)) aa 1 12
	
}